#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <cstdio>
#include <cstring>
#include <sys/types.h>
#include <sys/syscall.h>
using namespace std;

// // 线程分离演示
// void *startRoutine(void *args)
// {
//     // // 让线程进行分离
//     // pthread_detach(pthread_self());

//     while (true)
//     {
//         cout << "thread " << pthread_self() << endl;
//         sleep(1);
//     }

//    // pthread_exit(); exit()? -> 退出进程，任何一个线程调用exit，都表示整个进程退出
// }

// int main()
// {
//     pthread_t tid1;
//     pthread_t tid2;
//     pthread_t tid3;
//     pthread_create(&tid1, nullptr, startRoutine, (void *)"thread 1");
//     pthread_create(&tid2, nullptr, startRoutine, (void *)"thread 2");
//     pthread_create(&tid3, nullptr, startRoutine, (void *)"thread 3");
    
//     sleep(1); // 先让其它的线程执行
//     // 倾向于：让主线程，分离其它线程
//     pthread_detach(tid1);
//     pthread_detach(tid2);
//     pthread_detach(tid3);

//     // int n = pthread_join(tid1, nullptr);
//     // cout << n << " : " << strerror(n) << endl;
//     // n = pthread_join(tid2, nullptr);
//     // cout << n << " : " << strerror(n) << endl;
//     // n = pthread_join(tid3, nullptr);
//     // cout << n << " : " << strerror(n) << endl;
//     return 0;
// }

// 线程局部存储验证
__thread int global_value = 100;
// int global_value = 100;

void *startRoutine(void *args)
{
    while (true)
    {
        cout << "thread " << pthread_self() << " global_value = " << global_value
             << " &global_value = " << &global_value << "Inc = " << global_value++
             << " lwp = " << ::syscall(SYS_gettid) << endl;
        sleep(1);
    }
}

int main()
{
    pthread_t tid1;
    pthread_t tid2;
    pthread_t tid3;
    pthread_create(&tid1, nullptr, startRoutine, (void *)"thread 1");
    pthread_create(&tid2, nullptr, startRoutine, (void *)"thread 2");
    pthread_create(&tid3, nullptr, startRoutine, (void *)"thread 3");

    pthread_join(tid1, nullptr);
    pthread_join(tid2, nullptr);
    pthread_join(tid3, nullptr);
    return 0;
}

// static void PrintTid(const char *name, const pthread_t &tid)
// {
//     printf("%s 正在运行,thread id : 0x%x\n", name, tid);
// }

// void *startRoutine(void *args)
// {
//     const char *name = static_cast<const char *>(args);
//     int cnt = 5;
//     while (true)
//     {
//         // cout << "线程正在运行..." << endl;
//         PrintTid(name, pthread_self());
//         sleep(1);
//         if (!(cnt--))
//             break;
//     }
//     // return nullptr;
//     // return (void *)10;
//     pthread_exit((void*)111);
// }

// int main()
// {
//     pthread_t tid;
//     int n = pthread_create(&tid, nullptr, startRoutine, (void *)"thread1");
//     // sleep(10);
//     //  线程退出的时候，一般要进行join，若不进行join，就会造成类似于进程那样的内存泄漏问题。
//     //  pthread_join(tid, nullptr);
//     void *ret = nullptr;
//     pthread_join(tid, &ret); // void **retval是一个输出型参数
//     cout << "main thread join success, *ret = " << (int)(ret) << endl;

//     // // PrintTid(tid);
//     // //  cout << "new thread id:" << tid << endl; // 线程id

//     // while (true)
//     // {
//     //     PrintTid("main thread", pthread_self());
//     //     // cout << "main thread 正在运行..." << endl;
//     //     sleep(1);
//     // }
//     return 0;
// }
